package com.cn.JUC.pattern.case14;

import lombok.extern.slf4j.Slf4j;

/**
 * @Title Immutability模式
 * @Description Immutability模式：利用不变性解决并发问题
 * @Author CAI ZHAI
 * @Date 2021/9/9 15:03
 **/
@Slf4j
public class NoChangeImpl{
    
    /**
     * @Title 用final实现不可变模式
     * @Description 规则：类和属性都是 final 的，所有方法均是只读的。
     * @problem 被final修饰的属性只能是值，不能是引用，比如下面的String换成Stringbuffer就不行，
     *          这样使得不可变的是user引用，里面的值是可以通过append方法改变。
     **/
    public final class Account{
        private final String user;
        public Account(String user){
            this.user = user;
        }
        public String getUser(){
            return this.user;
        }
        public String toString(){
            return "user"+user;
        }
    }
    
    /**
     * @Title 用对象池实现返回不变对象
     * @Description 规则：类和属性都是 final 的，所有方法均是只读的。
     **/
    static Long valueOf(long l) {
        final int offset = 128;
        // [-128,127]直接的数字做了缓存
        if (l >= -128 && l <= 127) {
            return LongCache.cache[(int)l + offset];  //数据下标不能为负数，所以所有下标往前推128位
        }
        return new Long(l);
    }
    //缓存，等价于对象池
    //仅缓存[-128,127]直接的数字
    static class LongCache {
        static final Long cache[] = new Long[-(-128) + 127 + 1];
        
        static {
            for(int i=0; i<cache.length; i++) //预先缓存数据
                cache[i] = new Long(i-128);
        }
    }
    
    public static void main(String[] args){
        log.info(valueOf(5)+"");
    }
}
